package chapter025;

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;

/**
 * @author Jack魏
 * @date 2021-11-12
 *
 * Java是天生多线程的，即使只运行main方法，就会有多个线程执行。
 * [6] Monitor Ctrl-Break   监视器Ctrl-Break
 * [5] Attach Listener      负责接收到外部的命令，而对该命令进行执行的并且吧结果返回给发送者。
 *       通常我们会用一些命令去要求jvm给我们一些反 馈信息，如：java -version、jmap、jstack等等。
 *       如果该线程在jvm启动的时候没有初始化，那么，则会在用户第一次执行jvm命令时，得到启动。
 * [4] Signal Dispatcher    第一次接收外部jvm命令时，进行初始化工作。
 * [3] Finalizer            调用object类里面的finalize方法（守护线程）
 * [2] Reference Handler    主要用于处理引用对象本身（软引用、弱引用、虚引用）的垃圾回收问题。
 * [1] main
 */
public class Point1 {
    public static void main(String[] args){
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        // 不需要获取同步的monitor和synchronize信息，只获取线程和线程堆栈信息
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());
        }
    }
}
